﻿namespace MicroCloud.Utils
{
    /// <summary>
    /// 邮件地址数据类型
    /// </summary>
    [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter, AllowMultiple = false)]
    public class EmailAddressAttribute : DataTypeAttribute
    {
        /// <summary>
        /// 电子邮件地址正则表达式
        /// </summary>
        public const string EmailAddressRegex = @"^([a-zA-Z0-9_-\u4e00-\u9fa5])+@([a-zA-Z0-9_-\u4e00-\u9fa5])+((\.[a-zA-Z0-9_-\u4e00-\u9fa5]{2,3}){1,2})$";

        /// <summary>
        /// 初始化一个邮件地址数据类型 <see cref="EmailAddressAttribute"/> 的新实例
        /// </summary>
        public EmailAddressAttribute()
            : base(DataType.EmailAddress)
        { }

        #region 方法 - Overrides of DataTypeAttribute
        /// <summary>
        /// 检查数据字段的值是否有效
        /// </summary>
        /// <param name="value">要验证的数据字段值</param>
        /// <returns>如果指定的值有效或 null，则为 true；否则，为 false</returns>
        public override bool IsValid(object value)
        {
            if (value is string)
            {
                string input = value as string;
                if (input.IsNullOrEmpty())
                {
                    return true;
                }
                return input.IsMatch(EmailAddressRegex);
            }
            else
            {
                return false;
            }
        }

        /// <summary>
        /// 基于发生错误的数据字段对错误消息应用格式设置
        /// </summary>
        /// <param name="name">要包括在带有格式的消息中的名称</param>
        /// <returns>带有格式的错误消息的实例</returns>
        public override string FormatErrorMessage(string name)
        {
            return I18N.T("{0} 必须为有效的电子邮件地址", name);
        }

        #endregion

    }

}
